package com.test36_注解;

import org.junit.Test;

import java.lang.annotation.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 自定义Annotation
 */
public class Demo02_MyAnnotation {

    @Test
    public void test1() {
        Class<?> clazz = Message.class;
        for (Annotation annotation : clazz.getAnnotations()) {
            System.out.println(annotation);
        }
    }

    @Test
    public void test2() throws Exception {
        Class<?> clazz = Message.class;
        Method method = clazz.getMethod("echo", String.class);
        for (Annotation annotation : method.getAnnotations()) {
            System.out.println(annotation);
        }
    }

    @Test
    public void test3() throws Exception {
        Class<?> clazz = Message.class;
        Field field = clazz.getDeclaredField("message");
        for (Annotation annotation : field.getAnnotations()) {
            System.out.println(annotation);
        }
    }
}

/**
 * 所有的Annotation都有其运行的范围，需要通过@Retention注解来进行配置
 * 1.在使用该注解时，必须明确设置注解中的属性，如果不设置则认为是错误的引用
 * 2.如果某些属性希望可以自动使用默认值填充，就通过default配置
 * 3.value属性使用时，可以不需要通过变量名称来进行定义
 * 4.注解可以定义在类中的各个结构上，包括了类、方法、成员属性；
 * 如果只需要定义在部分结构上，需要通过@Target注解来进行配置
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)     // 在当前执行的时候此Annotation生效
@interface Action {     // 自定义了一个Annotation
    public String title() default "沐言优拓：www.yootk.com";  // 描述的是Annotation中的属性
    public String value();  // value是一个重要的标记
}

// @Action(title = "edu.yootk.com", value = "李兴华编程训练营：yootk.ke.qq.com")
@Action("李兴华编程训练营：yootk.ke.qq.com")
class Message {
    // @Action("李兴华编程训练营：yootk.ke.qq.com")
    private String message;

    @Action("李兴华编程训练营：yootk.ke.qq.com")
    public String echo(String msg) {
        return "【ECHO】" + msg;
    }
}
